package cn.zshprint.serein.service;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 复述,服务
 * redis操作Service
 * @author zshprint
 * @date 2021/07/29
 */
public interface RedisService {

    /**
     * 集
     * 保存属性
     *
     * @param key   关键
     * @param value 价值
     * @param time  时间
     */
    void set(String key, Object value, long time);

    /**
     * 集
     * 保存属性
     *
     * @param key   关键
     * @param value 价值
     */
    void set(String key, Object value);

    /**
     * 得到
     * 获取属性
     *
     * @param key 关键
     * @return {@link Object}
     */
    Object get(String key);

    /**
     * ▽
     * 删除属性
     *
     * @param key 关键
     * @return {@link Boolean}
     */
    Boolean del(String key);

    /**
     * ▽
     * 批量删除属性
     *
     * @param keys 键
     * @return {@link Long}
     */
    Long del(List<String> keys);

    /**
     * 到期
     * 设置过期时间
     *
     * @param key  关键
     * @param time 时间
     * @return {@link Boolean}
     */
    Boolean expire(String key, long time);

    /**
     * 会过期
     * 获取过期时间
     *
     * @param key 关键
     * @return {@link Long}
     */
    Long getExpire(String key);

    /**
     * 有关键
     * 判断是否有该属性
     *
     * @param key 关键
     * @return {@link Boolean}
     */
    Boolean hasKey(String key);

    /**
     * 增加
     * 按delta递增
     *
     * @param key   关键
     * @param delta δ
     * @return {@link Long}
     */
    Long incr(String key, long delta);

    /**
     * 12月
     * 按delta递减
     *
     * @param key   关键
     * @param delta δ
     * @return {@link Long}
     */
    Long decr(String key, long delta);

    /**
     * h得到
     * 获取Hash结构中的属性
     *
     * @param key     关键
     * @param hashKey 散列键
     * @return {@link Object}
     */
    Object hGet(String key, String hashKey);

    /**
     * h组
     * 向Hash结构中放入一个属性
     *
     * @param key     关键
     * @param hashKey 散列键
     * @param value   价值
     * @param time    时间
     * @return {@link Boolean}
     */
    Boolean hSet(String key, String hashKey, Object value, long time);

    /**
     * h组
     * 向Hash结构中放入一个属性
     *
     * @param key     关键
     * @param hashKey 散列键
     * @param value   价值
     */
    void hSet(String key, String hashKey, Object value);

    /**
     * h得到所有
     * 直接获取整个Hash结构
     *
     * @param key 关键
     * @return {@link Map<Object, Object>}
     */
    Map<Object, Object> hGetAll(String key);

    /**
     * h组所有
     * 直接设置整个Hash结构
     *
     * @param key  关键
     * @param map  地图
     * @param time 时间
     * @return {@link Boolean}
     */
    Boolean hSetAll(String key, Map<String, Object> map, long time);

    /**
     * h组所有
     * 直接设置整个Hash结构
     *
     * @param key 关键
     * @param map 地图
     */
    void hSetAll(String key, Map<String, Object> map);

    /**
     * h▽
     * 删除Hash结构中的属性
     *
     * @param key     关键
     * @param hashKey 散列键
     */
    void hDel(String key, Object... hashKey);

    /**
     * h有关键
     * 判断Hash结构中是否有该属性
     *
     * @param key     关键
     * @param hashKey 散列键
     * @return {@link Boolean}
     */
    Boolean hHasKey(String key, String hashKey);

    /**
     * h增加
     * Hash结构中属性递增
     *
     * @param key     关键
     * @param hashKey 散列键
     * @param delta   δ
     * @return {@link Long}
     */
    Long hIncr(String key, String hashKey, Long delta);

    /**
     * h 12月
     * Hash结构中属性递减
     *
     * @param key     关键
     * @param hashKey 散列键
     * @param delta   δ
     * @return {@link Long}
     */
    Long hDecr(String key, String hashKey, Long delta);

    /**
     * 年代的成员
     * 获取Set结构
     *
     * @param key 关键
     * @return {@link Set<Object>}
     */
    Set<Object> sMembers(String key);

    /**
     * 年代添加
     * 向Set结构中添加属性
     *
     * @param key    关键
     * @param values 值
     * @return {@link Long}
     */
    Long sAdd(String key, Object... values);

    /**
     * 年代添加
     * 向Set结构中添加属性
     *
     * @param key    关键
     * @param time   时间
     * @param values 值
     * @return {@link Long}
     */
    Long sAdd(String key, long time, Object... values);

    /**
     * s是成员
     * 是否为Set中的属性
     *
     * @param key   关键
     * @param value 价值
     * @return {@link Boolean}
     */
    Boolean sIsMember(String key, Object value);

    /**
     * 年代的大小
     * 获取Set结构的长度
     *
     * @param key 关键
     * @return {@link Long}
     */
    Long sSize(String key);

    /**
     * 年代删除
     * 删除Set结构中的属性
     *
     * @param key    关键
     * @param values 值
     * @return {@link Long}
     */
    Long sRemove(String key, Object... values);

    /**
     * l范围
     * 获取List结构中的属性
     *
     * @param key   关键
     * @param start 开始
     * @param end   结束
     * @return {@link List<Object>}
     */
    List<Object> lRange(String key, long start, long end);

    /**
     * l尺寸
     * 获取List结构的长度
     *
     * @param key 关键
     * @return {@link Long}
     */
    Long lSize(String key);

    /**
     * l指数
     * 根据索引获取List中的属性
     *
     * @param key   关键
     * @param index 指数
     * @return {@link Object}
     */
    Object lIndex(String key, long index);

    /**
     * l推
     * 向List结构中添加属性
     *
     * @param key   关键
     * @param value 价值
     * @return {@link Long}
     */
    Long lPush(String key, Object value);

    /**
     * l推
     * 向List结构中添加属性
     *
     * @param key   关键
     * @param value 价值
     * @param time  时间
     * @return {@link Long}
     */
    Long lPush(String key, Object value, long time);

    /**
     * 我把所有
     * 向List结构中批量添加属性
     *
     * @param key    关键
     * @param values 值
     * @return {@link Long}
     */
    Long lPushAll(String key, Object... values);

    /**
     * 我把所有
     * 向List结构中批量添加属性
     *
     * @param key    关键
     * @param time   时间
     * @param values 值
     * @return {@link Long}
     */
    Long lPushAll(String key, Long time, Object... values);

    /**
     * l删除
     * 从List结构中移除属性
     *
     * @param key   关键
     * @param count 数
     * @param value 价值
     * @return {@link Long}
     */
    Long lRemove(String key, long count, Object value);
}

